package br.com.linkcom.sined.modulo.sistema.controller.process;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.web.servlet.ModelAndView;

import br.com.linkcom.neo.authorization.process.ProcessAuthorizationModule;
import br.com.linkcom.neo.controller.Controller;
import br.com.linkcom.neo.controller.DefaultAction;
import br.com.linkcom.neo.controller.MessageType;
import br.com.linkcom.neo.controller.MultiActionController;
import br.com.linkcom.neo.core.web.WebRequestContext;
import br.com.linkcom.neo.util.Util;
import br.com.linkcom.sined.geral.bean.Ator;
import br.com.linkcom.sined.geral.bean.EnumGenero;
import br.com.linkcom.sined.geral.bean.Filme;
import br.com.linkcom.sined.geral.bean.Filmeator;
import br.com.linkcom.sined.geral.service.AtorService;
import br.com.linkcom.sined.geral.service.FilmeService;
import br.com.linkcom.sined.modulo.sistema.controller.process.filter.ImportarFiltro;

@Controller(path={"/sistema/process/Importar"}, authorizationModule=ProcessAuthorizationModule.class)
public class ImportarProcess extends MultiActionController {
	
	private FilmeService filmeService;
	private AtorService atorService;
	
	public void setFilmeService(FilmeService filmeService) {
		this.filmeService = filmeService;
	}
	public void setAtorService(AtorService atorService) {
		this.atorService = atorService;
	}
	
	@DefaultAction
	public ModelAndView index(WebRequestContext request, ImportarFiltro filtro) throws Exception {
		return new ModelAndView("process/importar", "filtro", filtro);
	}
	
	public ModelAndView importar(WebRequestContext request, ImportarFiltro filtro) throws Exception {
		
		File file = new File("C:\\Dropbox\\uni\\2011_1\\ia\\Trabalho\\implementacao\\dados\\filmes.csv");
		BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
		String linha1;
		String nomeFilme1;
		String nomeGenero;			
		String[] linhaSplit;
		String[] nomeAtoresSplit;
		Filme filme;
		Ator ator;
		Filmeator filmeator;
		List<String> linhas = new ArrayList<String>();
		Set<Filmeator> listaFilmeator;
		Set<String> nomesAtores = new HashSet<String>();
		Set<String> nomesAtoresAux;
		Map<String, Set<String>> mapaFilmeAtores = new HashMap<String, Set<String>>();
		Map<String, String> mapaFilmeGenero = new HashMap<String, String>();
		
		while ((linha1=bufferedReader.readLine())!=null){
			linha1 = Util.strings.tiraAcento(linha1).toUpperCase();
			linhas.add(linha1);
		}
		
		linhas = linhas.subList(1, linhas.size());
		
		for (String linha2: linhas){
			
			linhaSplit = linha2.split("\\;");
			nomeFilme1 = linhaSplit[0].trim();
			nomeGenero = linhaSplit[2].trim();
			nomeAtoresSplit = linhaSplit[1].split("\\,");
			nomesAtoresAux = new HashSet<String>();
			
			for (String nomeAtor: nomeAtoresSplit){
				nomesAtores.add(nomeAtor.trim());
				nomesAtoresAux.add(nomeAtor.trim());
			}
			
			mapaFilmeAtores.put(nomeFilme1, nomesAtoresAux);
			mapaFilmeGenero.put(nomeFilme1, nomeGenero);
		}
		
		for (String nomeAtor: nomesAtores){
			if (!nomeAtor.equals("")){
				ator = new Ator();
				ator.setNome(nomeAtor);
				atorService.saveOrUpdate(ator);
			}
		}
		
		for (String nomeFilme2: mapaFilmeAtores.keySet()){
			if (!nomeFilme2.equals("")){
				filme = new Filme();
				filme.setTitulo(nomeFilme2);
				listaFilmeator = new HashSet<Filmeator>();
				for (String nomeAtor: mapaFilmeAtores.get(nomeFilme2)){
					if (!nomeAtor.equals("")){
						filmeator = new Filmeator();
						filmeator.setFilme(filme);
						filmeator.setAtor(atorService.load(nomeAtor));
						listaFilmeator.add(filmeator);
					}
				}
				filme.setListaFilmeator(listaFilmeator);
				filme.setGenero(EnumGenero.valueOf(mapaFilmeGenero.get(nomeFilme2)));
				filmeService.saveOrUpdate(filme);
			}
		}
		
		request.addMessage("Registros importados com sucesso", MessageType.INFO);
		
		return new ModelAndView("process/importar", "filtro", filtro);
	}
}